{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Clustering_Kmean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import packages\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn import metrics\n",
    "\n",
    "from sklearn.decomposition import PCA\n",
    "import time\n",
    "import seaborn as sns\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "#read the data\n",
    "train = pd.read_csv('user_events.csv')\n",
    "\n",
    "#According to the requiremnts in the homework\n",
    "#only the feature c_1 to c_other was needed, which is col[9] to [110] \n",
    "Data = train.iloc[:,9:110]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>c_10</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 101 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   c_1  c_2  c_3  c_4  c_5  c_6  c_7  c_8  c_9  c_10   ...     c_92  c_93  \\\n",
       "0    2    0    2    0    0    0    0    0    0     0   ...        0     1   \n",
       "1    2    0    2    0    0    0    0    0    0     0   ...        0     0   \n",
       "2    0    0    0    0    0    0    0    0    0     0   ...        0     0   \n",
       "3    1    0    2    1    0    0    0    0    0     0   ...        0     0   \n",
       "4    1    1    0    0    0    0    0    2    0     0   ...        0     0   \n",
       "\n",
       "   c_94  c_95  c_96  c_97  c_98  c_99  c_100  c_other  \n",
       "0     0     0     0     0     0     0      0        9  \n",
       "1     0     0     0     0     0     0      0        7  \n",
       "2     0     0     0     0     0     0      0       12  \n",
       "3     0     0     0     0     0     0      0        8  \n",
       "4     0     0     0     0     0     0      0        9  \n",
       "\n",
       "[5 rows x 101 columns]"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Quick check\n",
    "Data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>c_10</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.359964</td>\n",
       "      <td>1.464972</td>\n",
       "      <td>1.323372</td>\n",
       "      <td>0.888732</td>\n",
       "      <td>1.159711</td>\n",
       "      <td>2.479654</td>\n",
       "      <td>0.986809</td>\n",
       "      <td>0.584439</td>\n",
       "      <td>0.660754</td>\n",
       "      <td>0.552914</td>\n",
       "      <td>...</td>\n",
       "      <td>0.064913</td>\n",
       "      <td>0.083992</td>\n",
       "      <td>0.093755</td>\n",
       "      <td>0.070502</td>\n",
       "      <td>0.082427</td>\n",
       "      <td>0.233790</td>\n",
       "      <td>0.082874</td>\n",
       "      <td>0.076837</td>\n",
       "      <td>0.073558</td>\n",
       "      <td>57.554777</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>19.331141</td>\n",
       "      <td>2.959769</td>\n",
       "      <td>2.720104</td>\n",
       "      <td>1.972209</td>\n",
       "      <td>15.695718</td>\n",
       "      <td>7.375475</td>\n",
       "      <td>18.371845</td>\n",
       "      <td>1.395134</td>\n",
       "      <td>1.630597</td>\n",
       "      <td>1.243510</td>\n",
       "      <td>...</td>\n",
       "      <td>0.309890</td>\n",
       "      <td>0.377730</td>\n",
       "      <td>0.388404</td>\n",
       "      <td>0.312148</td>\n",
       "      <td>0.503164</td>\n",
       "      <td>15.553234</td>\n",
       "      <td>0.356777</td>\n",
       "      <td>0.455338</td>\n",
       "      <td>0.337954</td>\n",
       "      <td>110.916584</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>38.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>75.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2186.000000</td>\n",
       "      <td>82.000000</td>\n",
       "      <td>85.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>1801.000000</td>\n",
       "      <td>306.000000</td>\n",
       "      <td>2120.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>1801.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>16.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>9664.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 101 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                c_1           c_2           c_3           c_4           c_5  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       2.359964      1.464972      1.323372      0.888732      1.159711   \n",
       "std       19.331141      2.959769      2.720104      1.972209     15.695718   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        1.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        3.000000      2.000000      2.000000      1.000000      1.000000   \n",
       "max     2186.000000     82.000000     85.000000     71.000000   1801.000000   \n",
       "\n",
       "                c_6           c_7           c_8           c_9          c_10  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       2.479654      0.986809      0.584439      0.660754      0.552914   \n",
       "std        7.375475     18.371845      1.395134      1.630597      1.243510   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        2.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "max      306.000000   2120.000000     23.000000     51.000000     51.000000   \n",
       "\n",
       "           ...               c_92          c_93          c_94          c_95  \\\n",
       "count      ...       13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       ...           0.064913      0.083992      0.093755      0.070502   \n",
       "std        ...           0.309890      0.377730      0.388404      0.312148   \n",
       "min        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "25%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "50%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "75%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "max        ...           7.000000      9.000000     10.000000      9.000000   \n",
       "\n",
       "               c_96          c_97          c_98          c_99         c_100  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       0.082427      0.233790      0.082874      0.076837      0.073558   \n",
       "std        0.503164     15.553234      0.356777      0.455338      0.337954   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max       23.000000   1801.000000      9.000000     16.000000      7.000000   \n",
       "\n",
       "            c_other  \n",
       "count  13418.000000  \n",
       "mean      57.554777  \n",
       "std      110.916584  \n",
       "min        0.000000  \n",
       "25%       14.000000  \n",
       "50%       38.000000  \n",
       "75%       75.000000  \n",
       "max     9664.000000  \n",
       "\n",
       "[8 rows x 101 columns]"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#statistical data of the Data\n",
    "#the max number of c_x exceeded 1000, which may be a outlier\n",
    "\n",
    "Data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe6a47b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#take a view of the oulier\n",
    "plt.figure(figsize=(5,4))\n",
    "sns.boxplot(y=Data['c_1']) \n",
    "plt.tight_layout() \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "#del the noise\n",
    "# Data = Data[(Data[\"c_1\"]<500)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 13418 entries, 0 to 13417\n",
      "Columns: 101 entries, c_1 to c_other\n",
      "dtypes: int64(101)\n",
      "memory usage: 10.3 MB\n"
     ]
    }
   ],
   "source": [
    "Data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Preprocessing\n",
    "# As the range of different feature was quite differnt, normalization of the data was needed \n",
    "\n",
    "from sklearn.preprocessing import scale\n",
    "from sklearn.preprocessing import MaxAbsScaler\n",
    "from sklearn.preprocessing import Normalizer\n",
    "\n",
    "# pre = MaxAbsScaler()\n",
    "pre = Normalizer()\n",
    "\n",
    "Data_pre = pre.fit_transform(Data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(13418, 101)"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Data_pre.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PCA demo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(13418, 51)\n"
     ]
    }
   ],
   "source": [
    "#Dimensionality resdution by PCA\n",
    "pca = PCA(n_components=0.9)\n",
    "pca.fit(Data_pre)\n",
    "\n",
    "Data_pca = pca.transform(Data_pre)\n",
    "\n",
    "print(Data_pca.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.19119717,  0.09570052,  0.0742193 ,  0.05631236,  0.04220377,\n",
       "        0.03306821,  0.02488464,  0.0209646 ,  0.02067397,  0.01922152,\n",
       "        0.01855473,  0.01765544,  0.01667346,  0.0153142 ,  0.01417486,\n",
       "        0.01260558,  0.01214198,  0.01117534,  0.01093796,  0.01052002,\n",
       "        0.01019549,  0.00957228,  0.0093179 ,  0.00868   ,  0.00846774,\n",
       "        0.00801873,  0.0079167 ,  0.0072334 ,  0.00696018,  0.00674017,\n",
       "        0.0064858 ,  0.00628224,  0.00586186,  0.00582018,  0.00561693,\n",
       "        0.00555847,  0.00541674,  0.0053242 ,  0.00516994,  0.00492006,\n",
       "        0.00466606,  0.00446916,  0.00441284,  0.00435893,  0.00424091,\n",
       "        0.00413261,  0.00407394,  0.00396485,  0.00392843,  0.00388877,\n",
       "        0.00376315])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.explained_variance_ratio_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# define the function for clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# As there was no reference, the Silhouette Coefficient and Calinski-Harabasz Index would be used\n",
    "# Scan for the PCA n_components and the K \n",
    "def K_cluster_analysis(K, X_train, batch_size, n_init, tol, n_components):\n",
    "    start = time.time()\n",
    "    #Dimensionality resdution by PCA\n",
    "    pca = PCA(n_components=n_components)\n",
    "    pca.fit(Data_pre)\n",
    "    Data_pca = pca.transform(Data_pre)  \n",
    "    \n",
    "    #MiniBatchKmeans \n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K, init='k-means++', n_init = n_init, tol = tol)\n",
    "    mb_kmeans.fit(X_train)\n",
    "    \n",
    "    # metric for each K and n_components\n",
    "    #Silhouette Coefficient was used as metric\n",
    "#     CH_score = metrics.calinski_harabaz_score(X_train,mb_kmeans.predict(X_train))\n",
    "    CH_score = metrics.silhouette_score(X_train,mb_kmeans.predict(X_train))\n",
    "    \n",
    "    end = time.time()\n",
    "    \n",
    "    print(\"\\t%f\\t\\t%f\\t%f\\t%f\"%(n_components, K, CH_score, int(end-start)))\n",
    "    \n",
    "    return CH_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n_components of PCA\t\tn_cluster\tCH_score\ttime\n",
      "\t0.900000\t\t2.000000\t0.639990\t4.000000\n",
      "\t0.900000\t\t10.000000\t0.067430\t4.000000\n",
      "\t0.900000\t\t20.000000\t0.048576\t4.000000\n",
      "\t0.900000\t\t30.000000\t0.047456\t4.000000\n",
      "\t0.900000\t\t40.000000\t0.029925\t4.000000\n",
      "\t0.900000\t\t50.000000\t0.084506\t4.000000\n",
      "\t0.900000\t\t60.000000\t0.055387\t4.000000\n",
      "\t0.900000\t\t70.000000\t0.036526\t4.000000\n",
      "\t0.900000\t\t80.000000\t0.070130\t4.000000\n",
      "\t0.900000\t\t90.000000\t0.072552\t4.000000\n",
      "\t0.900000\t\t100.000000\t0.036377\t4.000000\n",
      "\t0.850000\t\t2.000000\t0.644393\t4.000000\n",
      "\t0.850000\t\t10.000000\t-0.005889\t4.000000\n",
      "\t0.850000\t\t20.000000\t0.034555\t4.000000\n",
      "\t0.850000\t\t30.000000\t0.079896\t4.000000\n",
      "\t0.850000\t\t40.000000\t0.026594\t4.000000\n",
      "\t0.850000\t\t50.000000\t0.070782\t4.000000\n",
      "\t0.850000\t\t60.000000\t0.056335\t4.000000\n",
      "\t0.850000\t\t70.000000\t0.059815\t4.000000\n",
      "\t0.850000\t\t80.000000\t0.041758\t4.000000\n",
      "\t0.850000\t\t90.000000\t0.069022\t4.000000\n",
      "\t0.850000\t\t100.000000\t0.047139\t4.000000\n",
      "\t0.800000\t\t2.000000\t0.659730\t4.000000\n",
      "\t0.800000\t\t10.000000\t0.016828\t4.000000\n",
      "\t0.800000\t\t20.000000\t0.064655\t4.000000\n",
      "\t0.800000\t\t30.000000\t0.061786\t4.000000\n",
      "\t0.800000\t\t40.000000\t0.063738\t4.000000\n",
      "\t0.800000\t\t50.000000\t0.030798\t4.000000\n",
      "\t0.800000\t\t60.000000\t0.031458\t4.000000\n",
      "\t0.800000\t\t70.000000\t0.045129\t4.000000\n",
      "\t0.800000\t\t80.000000\t0.041859\t4.000000\n",
      "\t0.800000\t\t90.000000\t0.059473\t5.000000\n",
      "\t0.800000\t\t100.000000\t0.057831\t4.000000\n"
     ]
    }
   ],
   "source": [
    "# set the range of the K\n",
    "# As the orignal labels in the train.csv were [interest = 0, no_interest = 0], [1,0], [0,1],\n",
    "# The smallest K maybe 2\n",
    "Ks = [2,10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\n",
    "n_component_list = [0.9,0.85,0.8,0.75,0.7]\n",
    "CH_scores = []\n",
    "batch_size =100\n",
    "n_init = 10\n",
    "tol = 0.00001\n",
    "n_component_list = [0.9,0.85,0.8]\n",
    "print('n_components of PCA\\t\\tn_cluster\\tCH_score\\ttime')\n",
    "for n_components in n_component_list:  \n",
    "    for K in Ks:    \n",
    "        ch = K_cluster_analysis(K, Data_pca, batch_size, n_init, tol, n_components)\n",
    "        CH_scores.append(ch)     "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.63998973,  0.06742994,  0.04857561,  0.04745647,  0.02992453,\n",
       "         0.08450602,  0.05538653,  0.03652632,  0.07013035,  0.07255214,\n",
       "         0.03637725],\n",
       "       [ 0.64439332, -0.00588888,  0.03455471,  0.07989584,  0.02659437,\n",
       "         0.07078187,  0.05633469,  0.05981511,  0.04175772,  0.06902197,\n",
       "         0.04713936],\n",
       "       [ 0.65972973,  0.01682822,  0.06465471,  0.0617865 ,  0.06373796,\n",
       "         0.03079792,  0.0314577 ,  0.04512895,  0.04185891,  0.05947266,\n",
       "         0.05783094]])"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "CH_scores =np.array(CH_scores).reshape(len(n_component_list),len(Ks))  \n",
    "CH_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nqIiysjL6+vp4/vnnWbly5QnbbWhowOv1AvC///u/fOlLX/LvFxEA4y7cM7InkeHy4kVT21Ub7OYI\nEZaeffZZfvOb3zB37lzOO+88ampquPrqq5k7dy7z5s3j4osv5uc//znp6enD2u60adNYunQpl19+\nOY899hhRUVF89atfxePxMGfOHK6//nrWrFlzTI/9eKmpqaxZs4Ybb7yRuXPncs4553DgwIFPfd/P\nf/7z/O1vf6OgoIB3332Xe++9lzlz5jB79myWLFnCvHnzjhlzt1gs/Pa3v+Uzn/kMM2bMYNWqVcya\nZQyn3X///QPj9G+//TbTpk1j6tSp1NbW8r3vfW9Yv4/ToYJ1pefChQv1SO7E5PVq/vGz6XwvM4In\nL3uSxRnD6xkIcSbav38/M2bMCHYzguq2227jc5/7HNdee22wm3LGGOrfhVLqI631wlP97LjruZtM\nigidAoCzQy5kEkKIoYy7E6oAUZFZmPVeuUpViFF299138/777x/z3Ne//nVuv/32gL/XmjVrAr7N\ncDYuw53EHNLdu2WuuxCjrH+OuRh/xt2wDEBkSh52t5vDzTLXXQghhuJXuCulViilDiqlipVS951k\nnVVKqUKl1D6l1J8D28xjJWRMweF2U9V5ZDTfRgghxq1TDssopczAo8ClgBPYrpRar7UuHLROPvBd\n4HytdbNSKm20GgyQlj0V+wduWr2ddLu7ibacWPtCCCHCmT8998VAsda6VGvdBzwPXHncOl8BHtVa\nNwNoresC28xjpUx0kOoyrmSr7qgezbcSQohxyZ9wtwODL89y+p4bbCowVSn1vlLqQ6XUikA1cCjK\nZCJGG5fwyowZIcTpGq167hUVFSxbtoz58+czd+7cgdo05eXlREdHU1BQQEFBAatXrz7tfTieP7Nl\nhrqR3/FXPlmAfOAiwAG8q5SarbVuOWZDSt0J3AmQnZ097MYOFmueCNTKXHchxGl7++23iYuL47zz\nzvNr/f567m+88QYOh4NFixaxcuXKE0r+/vjHP2bVqlXcddddFBYWcsUVVwwUY5s8eTK7du0K9K4M\n8CfcnUDWoGUHcPxYiBP4UGvtAsqUUgcxwn774JW01o8Dj4NxhepIGw0QE5dDlLeGylYJdxFiXr0P\navYEdpvpc+DyoXuX/aSee+DruSulaGszavO3trYOWVxstPgzLLMdyFdK5SmlIoAbgPXHrfN3YBmA\n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\noP8PX/edhzFxzKcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe089a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# show the CH_scores as a function of n_components and K\n",
    "for i, n_components in enumerate(n_component_list):\n",
    "    plt.plot(Ks,CH_scores[i,:], label=\"n_components:\"+str(n_components))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 除了n_cluster = 2，n_components=0.9时，CH_score > 0.5\n",
    "# 其他值对应的CH_score < 0.2, 没有聚类效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSbWDav33SxgbS4zKSBzPZK327d4RBytXWXI9aZKiZn8v0PhBx13vgpvvLV/apEMOm6OXf7lX3/2v\np+b+/I2cd3v1lINWQ1k9/Q9ljULJVJg7Vi9YFhc6BymUDYKs4Dj6rQ++8OCDDx7a6LVDu/vygaN/\nq9+3IIlwiOHlT99PqzfVP2+wbGJJMjXtP6vSlvVc+vNsuaxv/tHpOuO6b2j2cYu17/GfafZxi+Pn\nH/3eHZIUnyN54PmJKEjtfy43SPlLgi6YZS0nHnJYtEx7yGFzcv8Mm/HNS5ZGw2DPukjn3fZQHBK7\nuXuzNxoNh73Pe7wfAa2Iz9zuvUcrz7XG9ZUNQzjrpNLW7GuzdpFu3bq19gy4DPSUAQhOvf6wxE7L\ncrmm2pVexqw5jinjc/IONZeiytbo/Ffp0Xu+pns/eL7k3ceisy/WorMvjkNWM0HK7+uq1xf28i/3\nylqrl3+5N76PdpvuF555YXQmZ6kU94cNdr+Y1NpuyX4Mhi3iM+ttPhjsjQk7rj1Xj376rdpx7bk9\n/VwXmP7wNxe0PA+tF5shhrZSFooQKnZU6xC6rGqWMUY21ZOWDlQ1k/6zTgRQ7S5O9/jL+5+rOf/x\n0e/doUVnXRRtCvCXSEvVIbZSfj9WvRlg/mu++19Pjb93v/shatHZF8evazTkdefGO6N7rnztfs+r\n0g0GvxLWSHFVpeb14zNb1X41r9PerpFS9M/PSI9LQ7ff/5j+8DcXyFR2RzZ779esOFGlklG5bJva\nDNFuv9vQ9pQhPITD4eOa6fNkhai8Jv5Gzfz13jPxvZtRVukbyzpuKH02ZNbn2vJkbr+Yr16P2du/\n+mD8vR+i3HX+z1Rkv1gziu0pazYcFH1d6Lr9c+T3pTVaytxx7bmaNlLSwcmyTvjot5v+RDfc1Zks\n25Ze345/++jZmnvodI0/f0C/fu09bQXKRj/vI596qyqHeOhVH6k9OH3XdW//V2vt8kafw/IlgCD5\nVa6s/rL07LGaobBKLXV61/mPp793fWL+5+x7/GeSFI+5WHTWRQ3HcuzceKdsuSxjSplLjm45ctFZ\nF6k0Mq3yniXZcjlRzcpa6ty58c6mZiYNjmaX+oq+rh29GLXhPmOpOvs5Gt1r+wNz212ic8NdJWnR\nh++uCTjfueq39Oin36rvXNX5KpKbaTb30OnRQNhDp0tKjvVodmhu+udNv84Y9++Wzu6Z5UsEI4Sl\nXB+Vu/6q1+Cf9by7JmugbL1KWdbr9u3ekRh7Mfu4xZp97AnxmAtbLsdhyV/KjN873kRQjgNXegSG\nv1OzPHlQxkQ9X+XJg3FFru5xR9bKej/DSe/+WB8a9l0lZ1zR8UTtVnSaXeor+rp2NNpgUORnWHV2\nyoB7n6WVX9uUvOfmloCvWXGi/vA3F0hSXG1KL9E1W316+KmJ+BikNFfR6nQiv+N6wNz/wI0/fyD3\nmkZLmemfN/266B95K2s7W9ollAE5QgiJUz0Y2m3bpDpjMXzNDoxNvyZ9bbxEmTNGw/Vq1SxJygt0\nxshUFhoe/d4d8VKmpHjZ0oWw2cctloxRqTQtDnqLzr5Y+x7/WRzQJGnRWRfFVbJGOyNd475/BFS9\nczI7lX8/7j/68xSdG9luUGm2P6zo69rRi14x/zM6+Tm2Kwpj7p+T9v76uEn5kuJqU9Y1zYQbf6hr\nOry4QNbpRH7HP6fSvyd/OTPvLMtGwSr9On/J0i11tnOGJz1lwBS049jO/y+zVy5aNr+pUNbqvDIp\nuw8tr8+s2V41/7Wu9+u82x6qzi6rePmXe+PdmHkDa12fmv/6R+/5WqJfLd0r5sZbOO51fshrFM78\nER/3fvD8utdKSvS26YcfkCSV3rRUxVXKUKuofrILFIVmqbZS1pxb/+XNNZUyKXn49/9+dKztPi33\nz8Vk2WqkZBKf0Q2Pfvqt8T9fiz5c2//l31urPXNSdqBrtqeMShmAgZU3YDbv6/ScsmYHzeYHuahf\nLL3cKVXnjPnXP3rP1yQpsaOz8sbx+/u7KrO4Klle83+9ipmreJlSdKC7P3OtnsTnHOIenSrN9KFq\nd5nUhbAxSXdVfrXL/TV+LDO8+Id/n7Puhy1XhVy1yd+JmReSijT+/IG4Utbo3toZa9HJ7ktCGTAF\nnbA7u/QfegWtXjUsr5KVfi6vr8y/Lmu4bHx9uRyFrGNPiHu2ckNaqZTdU6Zklc5/buGZFyaqWgvP\nvDCzipbH9bEZEy2f+js7G424iPvYKqHUbWDI8vYr3uJ9d7/0w/u9QCYV11tFuMuWt0yaDl1pbil5\nnqImf/fn6v85S839mUd/jfOW4dL9Ya32Urnw4lfceqGZKlwnwaoTLF8CQ67fQa3Z5ctONNN/5l8r\n1S59pqtlflN/vAGgEnRmH3tCYo5ZzfuWy7K2usvSX6605cmGZ2L6y4n1xm2kZfWGJUZyHHJ/0+9V\netPlKiZMTYUzKnvpckWhy0q6KeN5f7nSXbdN1RDtjgDL+jNPB+TawFxvVIa/HPnwUxMdHQpetB3X\nnquRkunJCI4sLF8CaIpfVet3QOuWvGDlq9kM0OAEAH+EhgtVbknQf33eXDS31Pitd70usWTZTMhq\nNPi1lcG1i85+h4wZ0aKz3yF7b/OhrPz9aiCI+suyNFMFG4QhqyEZU7VSlsVVz05Ttcnf/flmVcp8\n7vqlqm6WaD5w+4NZi9g9WSR/ifSaFSf2pQrWDEIZgL7a+8IBzfmV6bmVrHpBqpF6vWZ5758XzNKV\ns3K5LNmyFp75jur72OoB5a7a5X5PTPyvVMtcqHJnavrLiX6wkpQIWXVHZai6TOlGcdRt/t+zSXb+\nqdKeTbnv17z00lozS5zd3CmZVuRS6XsU/Sf0oKS/6uE9Ndsj5t7Lf+/0OIxird7wkN6waF68FNnp\n1H8puZmgncqbuwc3ssKY1ib513tP/+d69NNvjZ/vpC+OUAYg1o9etO88/LQuWpa/JFKvl6yRZkdt\n5L1/+jkXzNasWaPnnntOn//853X11Vdrzpw5Wr16tSRp5twjZUojmn3cYr38y701lbNqqJuMg9K9\nHzw/caTS1ls+WXOsUqMmfl+1V62UeF2yT6zy8+64S9rRSTO4z+9nksKrgrXTB5fXwzVN0c/a6X9G\nuzn3rNXA+6KkmZXf89ULW35wamU0RN57+psJ2uHPKnv4qQmdcORhTTfvu3va8cwv49et3vBQYvzH\nO5YfpxnTovaFRv2gzWCiP4CGTtg9UfOrX4rsP8tq4K/3L1bXIP/07p1at26dRkZGtG7dOo2Pj0f3\nVirFuy6NMZk7MOOdn6URnXHdN+Ln0iHMPxFgYs8jKk8e1MSeRxKHkjc6pHzf7h2ydlLmyX/JDGTF\nG1PUw+SW1u5TNZh1cwJ+nvRE++2K7s+0cD9+0PTf72DlvQ52eF/tT9XPf892npekryrqU/tq7ut2\nfmaPLv3PxR/MnXfY98NPTbQ8t8w/FWDfiwfjf65POPKweJJ/M9w9veao0cS9+T/XjGml2j7TDhRS\nKTPGnCNpnaQRSeuttdelnp8h6SuSfkPSs5LeYa3dWXnuQ5IukzQp6Upr7XeLuCcA3dXvHZ6tNu9n\nXZtVCfN/T4/NcL/+/Ka/0hdv/kr8uuuvvz7zM/3fs/raZh+3WG/50iYdctgcTR54SZKSfWKuT+3Y\n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\nZmZWgX8A5ekG2fGSJUwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xdf50978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#reduce the demension to 2 for visualization\n",
    "#demo\n",
    "pca = PCA(n_components=2)\n",
    "pca.fit(Data_pre)\n",
    "Data_pca = pca.transform(Data_pre)\n",
    "\n",
    "colors = ['b','g','r','k','c','m','y','#e24fff','#524C90','#845868']\n",
    "\n",
    "#clustering\n",
    "n_clusters = 10\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = n_clusters,batch_size = batch_size, n_init= n_init, tol=tol)\n",
    "mb_kmeans.fit(Data_pca)\n",
    "\n",
    "x_min, x_max = Data_pca[:, 0].min() - 1, Data_pca[:, 0].max() + 1\n",
    "y_min, y_max = Data_pca[:, 1].min() - 1, Data_pca[:, 1].max() + 1\n",
    "\n",
    "#split the plane into 10 colors accoring to the clustering result\n",
    "h=0.005\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
    "Z = mb_kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "\n",
    "# y_train_pred = mb_kmeans.labels_\n",
    "\n",
    "# Put the result into a color plot\n",
    "Z = Z.reshape(xx.shape)\n",
    "plt.figure(figsize=(10, 10))\n",
    "plt.clf()\n",
    "plt.imshow(Z, interpolation='nearest',\n",
    "           extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n",
    "           cmap=plt.cm.Paired,\n",
    "           aspect='auto', origin='lower')\n",
    "\n",
    "#plot the PCA data points\n",
    "plt.plot(Data_pca[:, 0], Data_pca[:, 1], 'wo', markersize=2)\n",
    "\n",
    "# Plot the centroids as a black X\n",
    "centroids = mb_kmeans.cluster_centers_\n",
    "plt.scatter(centroids[:, 0], centroids[:, 1],\n",
    "            marker='x', s=16, linewidths=3,\n",
    "            color='k', zorder=10)\n",
    "\n",
    "plt.axis([-0.5, 0.5, -0.5, 1.5])\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
